package com.guoxin.chapter2.t3;

/*
 * 虽然在赋值时进行了同步，但是取值时有可能出现一些意想不到的意外，这种情况就是脏读（dirtyRead。
 * 发生脏读的情况是咋读取实例变量时，此值已经被其他线程更改过了
 * 
 * @author guoxin
 */
public class PublicVar {
	public String username = "A";
	public String password = "AA";

	public synchronized void setValue(String username, String password) {
		try {
			this.username = username;
			Thread.sleep(5000);
			this.password = password;
			System.out.println("setValue method thread naem=" + Thread.currentThread().getName() + " username="
					+ username + " password=" + password);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 出现脏读是因为public void getValue()方法并不是同步对的，所有可以在任意时候进行调用。
	 * 解决办法是加上synchronized关键字。
	 */
	public /* synchronized */ void getValue() {
		System.out.println("getValue method thread naem=" + Thread.currentThread().getName() + " username=" + username
				+ " password=" + password);
	}
}
